package cn.snowheart.ch02.configuration;

import cn.snowheart.ch02.authentication.SecurityAuthenticationFailureHandler;
import cn.snowheart.ch02.authentication.SecurityAuthenticationSuccessHandler;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * 自定义登陆表单页面
 *
 * @author liuwanxiang
 * @version 2020/12/27
 */
@EnableWebSecurity
public class Ch02WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                // 所有请求需要鉴权
                .anyRequest().authenticated()
                .and()
                // 自定义登陆表单页面，且该页面不做鉴权
                // 默认情况下，loginPage 和 loginProcessingUrl 是同一个URL，仅方法不同
                // 可参见 AbstractAuthenticationFilterConfigurer 的 loginPage(String) 方法
                // 如果我们指定的页面和处理鉴权的URL不同时，需分别指定 loginPage 和 loginProcessingUrl 的值
                .formLogin().loginPage("/ch02-login.html")
                .loginProcessingUrl("/login")
                // 加入了自定义的成功和失败处理，主要用来对 application/json 格式的请求做支持
                .successHandler(new SecurityAuthenticationSuccessHandler())
                .failureHandler(new SecurityAuthenticationFailureHandler())
                .permitAll()
                .and()
                // 关闭 CSRF 跨站请求伪造防护拦截
                .csrf().disable();
    }
}
